#pragma once

#include "IFourierTransform.h"
#include "FourierTransformFactoryBase.h"

namespace FTLib
{
	class CFourierTransformFactoryFFTWFft : public CFourierTransformFactoryBaseEmptyDefaultImp< CFourierTransformFactoryFFTWFft >
	{
	private:
		static const char* DllNameFFTWF;
	public:
		static void GetVersionString(std::wstring& str);
	public:
		virtual std::shared_ptr<IRealToComplex_PackedFftwComplex> CreateRealToComplexPackedFftw(const Options& opts);
		virtual std::shared_ptr<IRealToComplex_PackedIppComplex> CreateRealToComplexPackedIpp(const Options& opts);
		virtual std::shared_ptr<IRealToComplex_Complex> CreateRealToComplex(const Options& opts);
		virtual std::shared_ptr<IRealToComplex_Complex> CreateRealToComplex_Shifted(const Options& opts);
		virtual std::shared_ptr<IComplexToComplexFwd_Complex> CreateComplexToComplexFwd(const Options& opts);
		virtual std::shared_ptr<IComplexToComplexInv_Complex> CreateComplexToComplexInv(const Options& opts);
		virtual std::shared_ptr<IComplexHermitianToReal> CreateComplexHermitianToReal(const Options& opts);
	protected:
		friend class CFourierTransformFactoryBase < CFourierTransformFactoryFFTWFft > ;
		static bool CanLoadLibrary();
		static bool CanOperate();
	};
}